Спринт 2/18 → Тема 6/6: Основы отладки программ → Урок 1/3
Виды ошибок в коде
Ошибки в коде — это норма. С ними сталкиваются и начинающие разработчики, и опытные. Поэтому исправление ошибок — часть процесса разработки. А чтобы ошибки исправить, их нужно найти.
Почему ошибки называют багами
На IT-сленге ошибки называют багами (от англ. bug, «жук»). Такое название появилось не случайно.
В 1945 году, когда учёные Гарвардского университета тестировали одну из своих вычислительных машин, «компьютер» внезапно остановился. Такого не должно было произойти, так как считалось, что тестируется едва ли не самая передовая и надёжная техника.
Учёные начали искать причину сбоя. Такой причиной оказался мотылёк, который застрял в механизме. Учёные достали мотылька и сделали в журнал запись об инциденте: First actual case of bug being found, что переводится на русский язык как «первый реальный случай обнаружения ошибки», дословно «первый реальный случай обнаружения жука».
Считается, что именно после этого случая программные ошибки начали называть багами, а процесс анализа кода для выявления и устранения ошибок — дебаггингом.
Какие бывают ошибки
Принято выделять три вида ошибок:
- синтаксические,
- логические,
- исключения.
Синтаксические ошибки программисту искать не нужно. Такие ошибки интерпретатор находит и обрабатывает сам, так как синтаксические ошибки — это нарушение синтаксиса языка. Если в программе есть подобные ошибки, программа не запустится, и Python выведет в терминал соответствующее сообщение.
Запустите простую программу. Ничего не меняйте, мы специально написали её с ошибкой:
КодPYTHON
Запуск программы не состоялся, и Python сообщил почему: подсказал, в какой строке что-то пошло не так, указал на тип ошибки, а также описал причину.
💡 Всегда читайте сообщения об ошибках; это поможет вам быстрее найти и устранить проблемные места в коде.
Логические ошибки интерпретатор не умеет отслеживать. Программисту придётся отыскивать их самостоятельно. Логические ошибки появляются, когда разработчик неправильно описывает алгоритм работы программы.
Предположим, у программиста есть задача: написать программу, которая будет считать среднее значение двух чисел. Программист задачу выполнил и написал вот такой код:
PYTHON
Программа отработает, ошибок в терминале не будет, ведь для интерпретатора Python все правила соблюдены. Только вот ответ будет неверным, потому что программист не поставил скобки в формуле. В этом и заключается суть логической ошибки — программист неправильно описал логику работы программы, и программа отработала не так, как ожидалось.
Исключения (от англ. Exceptions) — это вид ошибок, какой появляется в тех случаях, когда в ходе работы программы возникает ситуация, которую разработчик не описал в коде. То есть программа запускается, но не выполняется целиком.
Например, исключение может сработать при операциях над разными типами данных.
Перед вами программа, которая по задаче должна складывать значения элементов списка и после каждой итерации выводить результат. Запустите её.
КодPYTHON
Программа начала свою работу, но застопорилась на одном из значений и вывела отчёт об ошибке (от англ. Traceback), в котором описана проблема — нельзя сложить значения разных типов (числа и строки).
💡 Исключения бывают разные, узнать больше о типах исключений можно из документации.
Новая задача
Форкните и клонируйте к себе на компьютер репозиторий с игрой «Рассчитай и победи!».
В этом репозитории лежит два Python-файла:
- main.py — основной файл программы, запускает игру;
- module.py — файл с расчётными функциями.
Откройте репозиторий с игрой в редакторе кода. В этой игре не используются сторонние пакеты и модули, но это не значит что так будет всегда. Поэтому не забудьте создать и активировать виртуальное окружение.
Перейдите в терминал и запустите файл main.py:
BASH
Вывод в терминале должен быть таким:
BASH
Разберём правила: игрок должен сделать пять ходов и для каждого хода выбрать тип атаки — lite, mid или hard. Типы атаки отличаются количеством очков возможного урона. Цель игрока — набрать максимально близкое количество очков атаки к сгенерированному количеству очков здоровья противника.
Сыграйте в игру: атакуйте противника пять раз, используя любые виды атак.
Мы тоже попробовали сыграть в игру и пять раз атаковали противника:
BASH
Результат работы программы был таким:
BASH
Если пересчитать сумму очков урона, то получится 136 (39+21+34+40+2), но никак не 5.
Итак, кажется первая возможная ошибка идентифицирована.
Попробуйте сыграть в игру ещё раз, введите
y, как и просит программа.И снова что-то пошло не так! Программа совсем сломалась и вернула исключение, что введённое значение не соответствует запрашиваемому.
Поиграть толком не вышло, зато тестирование прошло «на ура». Проблемы обнаружены, теперь нужно отладить (или отдебажить) программу, то есть найти причины возникновения ошибок и устранить их. Этим мы и займёмся в следующем уроке.